home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / FALCON / ACC / OUTLINE.ACC / SLIDERS.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  8.6 KB  |  314 lines

  1. /* FILE:     SLIDERS.C
  2.  *==========================================================================
  3.  * DATE:        February 5, 1990
  4.  * MODIFIED: November 16, 1990 - for FSMACC.ACC
  5.  *        November 5, 1992 3D
  6.  *
  7.  * DESCRIPTION:  MODIFIED TO REMOVE HORIZONTAL CODE                           
  8.  *
  9.  * INCLUDE FILE: SLIDERS.H
  10.  */
  11.  
  12. /* INCLUDE FILES
  13.  *==========================================================================
  14.  */ 
  15. #include <sys\gemskel.h>
  16. #include <stdlib.h>
  17.  
  18. #include "country.h"
  19. #include "mainstuf.h"
  20.  
  21.  
  22.  
  23.  
  24. /* PROTOTYPES
  25.  *==========================================================================
  26.  */
  27. void sl_size( OBJECT *tree, int base, int slider, int num_items,
  28.               int visible, int direction, int min_size );
  29.            
  30. void sl_y( OBJECT *tree, int base, int slider, int value,
  31.            int num_min, int num_max, void (*foo)() );
  32.  
  33. void sl_arrow( OBJECT *tree, int base, int slider, int obj,
  34.                int inc, int min, int max, int *numvar, int direction,
  35.                void (*foo)() );
  36.                
  37. void sl_dragy( OBJECT *tree, int base, int slider, int min,
  38.                int max, int *numvar, void (*foo)() );
  39.                
  40. int  Calc_Value( int slidxy, int basexy, int basewh,
  41.                  int obwh, int min, int max );
  42.  
  43.  
  44. /* DEFINES
  45.  *==========================================================================
  46.  */
  47. /* Slider Time Delay Definitions */
  48. #define SL_MAX_DELAY     0
  49. #define SL_MIN_DELAY     0
  50. #define SL_INC         0
  51.  
  52. /* Orientation of sliders */
  53. #define VERTICAL    0
  54. #define HORIZONTAL    1
  55.  
  56. #define NULLFUNC    ( void(*)())0L
  57.  
  58.  
  59.  
  60. /* GLOBALS
  61.  *==========================================================================
  62.  */
  63.  
  64.  
  65.  
  66.  
  67. /* sl_size()
  68.  *==========================================================================
  69.  * Size the slider
  70.  *
  71.  * IN:       OBJECT *tree:    Object tree
  72.  *       int    base:        base of slider
  73.  *       int    slider:    slider object - it must be child of base
  74.  *       int    num_items:    Total number of items accounted for
  75.  *       int    visible:    Number of said items visible at one time
  76.  *       int    direction:    Horizontal or Vertical - See defines above
  77.  *       int      min_size:    Minimum Pixel Size
  78.  *
  79.  * OUT:    void
  80.  */ 
  81. void
  82. sl_size( OBJECT *tree, int base, int slider, int num_items,
  83.          int visible, int direction, int min_size )
  84. {
  85.      int size = 1000;
  86.  
  87.      if( visible && num_items )
  88.        size = min( 1000, (int)((1000L * (long)visible) / (long)num_items) );
  89.  
  90.       if( direction == VERTICAL )
  91.       {
  92.          ObH( slider ) = (int)(( (long)size * (long)ObH( base )) / 1000L );
  93.          ObH( slider ) = max( min_size, ObH( slider ) );
  94.       }   
  95. }
  96.  
  97.  
  98.  
  99.  
  100. /* sl_y()
  101.  *==========================================================================
  102.  * Modify slider in y position
  103.  *
  104.  * IN:   OBJECT *tree:        object tree
  105.  *     int    base:        base of slider
  106.  *     int    slider:            slider object - must be child of base
  107.  *     int    txtobj:        txtobj for numbers. This does NOT have to
  108.  *                be a child of the base. -1 if there is none.
  109.  *     int    value:        current value
  110.  *     int    num_min:    minimum item number
  111.  *     int    num_max:    maximum item number
  112.  *     void  (*foo)():    Drawing routine passed in by calling routine
  113.  *
  114.  * OUT:  void
  115.  */
  116. void
  117. sl_y( OBJECT *tree, int base, int slider, int value,
  118.       int num_min, int num_max, void (*foo)( void ) )      
  119. {
  120.     if( value == num_min ) {
  121.     ObY(slider) = ObH(base) - ObH(slider);
  122.     } else {
  123.     ObY(slider) = 
  124.         (int)( ( (long)(value-num_max) *
  125.                ( (long)(ObH(base) - ObH(slider)) * 1000L )
  126.                ) /
  127.                ( (long)(num_min - num_max) * 1000L )
  128.                );
  129.     }   
  130.     
  131.     if( foo != NULLFUNC )
  132.         (*foo)();          
  133. }
  134.  
  135.  
  136.  
  137. /* sl_arrow()
  138.  *==========================================================================
  139.  * Handle both horizontal and vertical arrow buttons
  140.  *
  141.  * IN:   OBJECT *tree:        object tree
  142.  *     int base:        base of slider object
  143.  *     int slider:        slider object - this must be child of base
  144.  *     int obj:        Arrow object clicked on
  145.  *     int txtobj:        txt object for numbers. -1 if there is none.
  146.  *                Does not have to be a child of base.
  147.  *     int inc:        increment by this amount
  148.  *     int min:        min item number
  149.  *     int max:        max item number
  150.  *     int *numvar:        current value
  151.  *     int direction:        Horizontal or vertical
  152.  *     void (*foo)():        Drawing routine passed in.
  153.  *
  154.  * OUT:  void
  155.  */
  156. void
  157. sl_arrow( OBJECT *tree, int base, int slider, int obj,
  158.           int inc, int min, int max, int *numvar,
  159.           int direction, void (*foo)() )
  160. {
  161.     MRETS mk;
  162.     int   newvalue, oldvalue;
  163.     GRECT slidrect;
  164.     MRETS m;
  165.  
  166.     slidrect = ObRect( slider );
  167.     objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  168.     /* account for outlines */
  169.     slidrect.g_x -= 3;
  170.     slidrect.g_y -= 3;
  171.     slidrect.g_w += 6;
  172.     slidrect.g_h += 6;
  173.  
  174.     if( obj > 0 )
  175.     XSelect( tree, obj );
  176.  
  177.     oldvalue = *numvar;
  178.     do {
  179.     newvalue = *numvar + inc;
  180.  
  181.     if( max > min )
  182.     {
  183.         if( newvalue < min ) newvalue = min;
  184.         else if( newvalue > max ) newvalue = max;
  185.     }
  186.     else
  187.     {
  188.         if( newvalue > min ) newvalue = min;
  189.         else if( newvalue < max ) newvalue = max;
  190.     }
  191.  
  192.     /* if in bounds, change the slider thumb */
  193.     if( newvalue != oldvalue ) {
  194.         oldvalue = newvalue;
  195.         *numvar = newvalue;
  196.  
  197.         if( direction == VERTICAL )          
  198.             sl_y( tree, base, slider, newvalue, min, max, foo );
  199.             
  200.         /* undraw old */
  201.         Objc_draw( tree, base, 3 , &slidrect ); /* was 0 */
  202.         /* draw new */
  203.         objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  204.             slidrect.g_x -= 3;
  205.             slidrect.g_y -= 3;
  206.         Objc_draw( tree, slider, 3 , &slidrect );
  207.         }
  208.     Graf_mkstate( &mk );
  209.     } while( mk.buttons != 0 );
  210.  
  211.     if( obj > 0 )
  212.     XDeselect( tree, obj );
  213.     Objc_draw( tree, base, MAX_DEPTH, &slidrect );
  214.     Evnt_button( 1, 1, 0, &m );
  215. }
  216.  
  217.  
  218.  
  219. /* sl_dragy()
  220.  *==========================================================================
  221.  * Handle dragging the slider vertically
  222.  */
  223. void
  224. sl_dragy( OBJECT *tree, int base, int slider, int min,
  225.           int max, int *numvar, void (*foo)() )
  226. {
  227.     int newvalue, yoffset, slidy, lastvalue;
  228.     MRETS mk;
  229.     GRECT baserect, slidrect;
  230.  
  231.    /* get slider extent */
  232.     baserect = ObRect( base );
  233.     objc_offset( tree, base, &baserect.g_x, &baserect.g_y );
  234.  
  235.     /* get slide box extent */
  236.     slidrect = ObRect( slider );
  237.     objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  238.     /* find mouse offset into slide box */
  239.     Graf_mkstate( &mk );
  240.     yoffset = mk.y - (slidrect.g_y + (slidrect.g_h / 2));
  241.     /* adjust box w/h for clip */
  242.     slidrect.g_x -= 3;
  243.     slidrect.g_y -= 3;
  244.     slidrect.g_w += 6;
  245.     slidrect.g_h += 6;
  246.  
  247.     lastvalue = min-1;
  248.     while( mk.buttons )
  249.     {
  250.        /* get current slide box Y coordinate */
  251.        slidy = mk.y - yoffset;
  252.        /* translate it to a value */
  253.        if( slidy < baserect.g_y + ObH(slider)/2 )
  254.           newvalue = max;
  255.        else if( slidy > baserect.g_y + baserect.g_h - ObH(slider)/2 )
  256.           newvalue = min;
  257.        else{
  258.         newvalue = Calc_Value( slidy, baserect.g_y,
  259.                        baserect.g_h, ObH( slider ),
  260.                        max, min );         
  261.        }
  262.        if( newvalue != lastvalue )
  263.        {
  264.           lastvalue = newvalue;
  265.           /* update the value, and draw the slidebox */
  266.           *numvar = newvalue;
  267.           sl_y( tree, base, slider, newvalue, min, max, foo );
  268.           /* undraw old */
  269.           Objc_draw( tree, base, 2, &slidrect );
  270.           objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  271.           
  272.           slidrect.g_x -= 3;
  273.           slidrect.g_y -= 3;
  274.  
  275.           /* draw new */
  276.       Objc_draw( tree, slider , MAX_DEPTH, &slidrect );
  277.     }
  278.     Graf_mkstate( &mk );
  279.     }
  280. }
  281.  
  282.  
  283.  
  284.  
  285. /* Calc_Value()
  286.  *==========================================================================
  287.  *Calculate a new value for sl_dragx() and sl_dragy()
  288.  *  IN: int    slidxy:      sldx or sldy
  289.  *      int    basexy:        baserect.g_x or baserect.g_y
  290.  *    int    basewh:        baserect.g_w or baserect.g_h
  291.  *    int    obwh:        ObH() or (ObW)
  292.  */
  293. int
  294. Calc_Value( int slidxy, int basexy, int basewh,
  295.             int obwh, int min, int max )
  296. {
  297.    long top = 0L;
  298.    int  digit = 0;
  299.    long bottom = 0L;
  300.    
  301.    top      = (long)((long)(max - min) * 1000L *
  302.                      (long)(slidxy - basexy - ( obwh / 2 ) ) );
  303.                     
  304.    bottom   = (long)(basewh - obwh ) * 1000L;
  305.    if( top && bottom )
  306.    {
  307.      digit    = (int)((long)(top % bottom) > (long)(bottom / 2L));
  308.      top     /= bottom;
  309.    }  
  310.    return( min + (int)top + digit );
  311. }
  312.  
  313.  
  314.